/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.modelo;

import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.validador.CNPJ;
import br.com.foxinline.validador.CPF;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import javax.validation.constraints.Size;

/**
 *
 * @author ely
 */
@Entity
public class Pessoa implements Serializable {

    @Id
    @SequenceGenerator(sequenceName = "seq_pessoa", name = "seq_pessoa", allocationSize = 1)
    @GeneratedValue(generator = "seq_pessoa", strategy = GenerationType.SEQUENCE)
    private Long id;
    private String nome;
    private String nomeFantasia;
    private String nomeMae;
    @CPF
    private String cpf;
    private String rg;
    @CNPJ
    private String cnpj;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataNascimento;    
    @Enumerated(EnumType.STRING)
    private TipoDocumento tipoDocumento;
    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private List<Banco> bancos;
    @Version
    private int versao;
    @OneToOne(cascade={CascadeType.ALL}, orphanRemoval=true)
    private Endereco endereco;
    @Size(max = 1500)
    private String descricao;
    private String telefone1;
    private String telefone2;
    @OneToMany(cascade={CascadeType.ALL}, orphanRemoval=true)
    private List<Setor> setores;
    @OneToMany
    private List<Usuario> usuarios;

    public Pessoa() {
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getNomeFantasia() {
        return nomeFantasia;
    }

    public void setNomeFantasia(String nomeFantasia) {
        this.nomeFantasia = nomeFantasia;
    }

    public String getNomeMae() {
        return nomeMae;
    }

    public void setNomeMae(String nomeMae) {
        this.nomeMae = nomeMae;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getRg() {
        return rg;
    }

    public void setRg(String rg) {
        this.rg = rg;
    }

    public String getCnpj() {
        return cnpj;
    }

    public void setCnpj(String cnpj) {
        this.cnpj = cnpj;
    }

    public Date getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(Date dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public List<Banco> getBancos() {
        return bancos;
    }

    public void setBancos(List<Banco> bancos) {
        this.bancos = bancos;
    }

    public TipoDocumento getTipoDocumento() {
        return tipoDocumento;
    }

    public void setTipoDocumento(TipoDocumento tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }

    public int getVersao() {
        return versao;
    }

    public void setVersao(int versao) {
        this.versao = versao;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getTelefone1() {
        return telefone1;
    }

    public void setTelefone1(String telefone1) {
        this.telefone1 = telefone1;
    }

    public String getTelefone2() {
        return telefone2;
    }

    public void setTelefone2(String telefone2) {
        this.telefone2 = telefone2;
    }

    public List<Setor> getSetores() {
        return setores;
    }

    public void setSetores(List<Setor> setores) {
        this.setores = setores;
    }

    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Pessoa other = (Pessoa) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if ((this.nome == null) ? (other.nome != null) : !this.nome.equals(other.nome)) {
            return false;
        }
        if ((this.nomeFantasia == null) ? (other.nomeFantasia != null) : !this.nomeFantasia.equals(other.nomeFantasia)) {
            return false;
        }
        if ((this.nomeMae == null) ? (other.nomeMae != null) : !this.nomeMae.equals(other.nomeMae)) {
            return false;
        }
        if ((this.cpf == null) ? (other.cpf != null) : !this.cpf.equals(other.cpf)) {
            return false;
        }
        if ((this.rg == null) ? (other.rg != null) : !this.rg.equals(other.rg)) {
            return false;
        }
        if ((this.cnpj == null) ? (other.cnpj != null) : !this.cnpj.equals(other.cnpj)) {
            return false;
        }
        if (this.dataNascimento != other.dataNascimento && (this.dataNascimento == null || !this.dataNascimento.equals(other.dataNascimento))) {
            return false;
        }
        if (this.tipoDocumento != other.tipoDocumento) {
            return false;
        }
        if (this.bancos != other.bancos && (this.bancos == null || !this.bancos.equals(other.bancos))) {
            return false;
        }
        if (this.versao != other.versao) {
            return false;
        }
        if (this.endereco != other.endereco && (this.endereco == null || !this.endereco.equals(other.endereco))) {
            return false;
        }
//        if (this.responsaveisEmpresa != other.responsaveisEmpresa && (this.responsaveisEmpresa == null || !this.responsaveisEmpresa.equals(other.responsaveisEmpresa))) {
//            return false;
//        }
        if ((this.descricao == null) ? (other.descricao != null) : !this.descricao.equals(other.descricao)) {
            return false;
        }
        if ((this.telefone1 == null) ? (other.telefone1 != null) : !this.telefone1.equals(other.telefone1)) {
            return false;
        }
        if ((this.telefone2 == null) ? (other.telefone2 != null) : !this.telefone2.equals(other.telefone2)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 53 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 53 * hash + (this.nome != null ? this.nome.hashCode() : 0);
        hash = 53 * hash + (this.nomeFantasia != null ? this.nomeFantasia.hashCode() : 0);
        hash = 53 * hash + (this.nomeMae != null ? this.nomeMae.hashCode() : 0);
        hash = 53 * hash + (this.cpf != null ? this.cpf.hashCode() : 0);
        hash = 53 * hash + (this.rg != null ? this.rg.hashCode() : 0);
        hash = 53 * hash + (this.cnpj != null ? this.cnpj.hashCode() : 0);
        hash = 53 * hash + (this.dataNascimento != null ? this.dataNascimento.hashCode() : 0);
        hash = 53 * hash + (this.tipoDocumento != null ? this.tipoDocumento.hashCode() : 0);
        hash = 53 * hash + (this.bancos != null ? this.bancos.hashCode() : 0);
        hash = 53 * hash + this.versao;
        hash = 53 * hash + (this.endereco != null ? this.endereco.hashCode() : 0);
        hash = 53 * hash + (this.descricao != null ? this.descricao.hashCode() : 0);
        hash = 53 * hash + (this.telefone1 != null ? this.telefone1.hashCode() : 0);
        hash = 53 * hash + (this.telefone2 != null ? this.telefone2.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return "Pessoa{" + "id=" + id + ", nome=" + nome + ", nomeFantasia=" + nomeFantasia + ", nomeMae=" + nomeMae + ", cpf=" + cpf + ", rg=" + rg + ", cnpj=" + cnpj + ", dataNascimento=" + dataNascimento + ", tipoDocumento=" + tipoDocumento + ", bancos=" + bancos + ", versao=" + versao + ", endereco=" + endereco + ", descricao=" + descricao + ", telefone1=" + telefone1 + ", telefone2=" + telefone2 + '}';
    }
}
